package com.cow.framework.utils.string;

/**
 * 汉字拼音方法
 * 
 * @author wencx@sany.com.cn
 * @since 2014-10-16
 * @version 1.0
 *
 */
public class PinyinUtil {

	private static int BEGIN = 45217;
	private static int END = 63486;

	private static char[] chartable = { '啊', '芭', '擦', '搭', '蛾', '发', '噶', '哈',
			'哈', '击', '喀', '垃', '妈', '拿', '哦', '啪', '期', '然', '撒', '塌', '塌',
			'塌', '挖', '昔', '压', '匝', };

	/**
	 * 二十六个字母区间对应二十七个端点 GB2312码汉字区间十进制表示
	 */
	private static int[] table = new int[27];

	// 对应首字母区间表
	private static char[] initialtable = { 'a', 'b', 'c', 'd', 'e', 'f', 'g',
			'h', 'h', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
			't', 't', 'w', 'x', 'y', 'z', };

	// 初始化
	static {
		for (int i = 0; i < 26; i++) {
			table[i] = gbValue(chartable[i]);
		}
		table[26] = END;
	}

	/**
	 * 
	 * 将字符串中的汉字替换为拼音首字母，并去掉字串中的空格
	 * 
	 * @param SourceStr 输入字符串
	 * @return 将字符串中的汉字替换为拼音首字母，并去掉字串中的空格
	 *
	 */
	public static String getFirstletter(String SourceStr) {
		String Result = "";
		int StrLength = SourceStr.length();
		int i;
		try {
			for (i = 0; i < StrLength; i++) {
				if(' '!=SourceStr.charAt(i)){
					Result += Char2Initial(SourceStr.charAt(i));
				}
			}
		} catch (Exception e) {
			Result = "";
		}
	
		return Result;
	}

	/**
	 * 输入字符,得到他的声母,英文字母返回对应的大写字母,其他非简体汉字返回 '0'
	 **/
	private static char Char2Initial(char ch) {

		if (ch >= 'a' && ch <= 'z')
			return ch;
		if (ch >= 'A' && ch <= 'Z')
			return (char) (ch - 'A' + 'a');
		int gb = gbValue(ch);
		if ((gb < BEGIN) || (gb > END))
			return ch;
		int i;
		for (i = 0; i < 26; i++) {
			if ((gb >= table[i]) && (gb < table[i + 1]))
				break;
		}
		if (gb == END) {
			i = 25;
		}
		return initialtable[i];
	}

	/**
	 * 取出汉字的编码 cn 汉字
	 */
	private static int gbValue(char ch) {
		String str = new String();
		str += ch;
		try {
			byte[] bytes = str.getBytes("GB2312");
			if (bytes.length < 2)
				return 0;
			return (bytes[0] << 8 & 0xff00) + (bytes[1] & 0xff);
		} catch (Exception e) {
			return 0;
		}
	}

}